package com.ws.genercity.demo03;

import java.util.ArrayList;
import java.util.Random;

/**
 * @author 13353
 * 泛型类案例 -- 抽奖
 */
public class ProductGetter<T> {
    Random random = new Random();

    //奖品
    private T product;

    //所有奖品
    ArrayList<T> list = new ArrayList<>();

    //添加商品
    public void addProduct(T t) {
        list.add(t);
    }

    //抽奖
    //不能声明成static静态的方法
    public T getProduct() {
        return list.get(random.nextInt(list.size()));
    }

    /**
     *     //泛型方法
     * @param list 参数
     * @return
     * @param <E> 泛型标识，具体类型，有调用方法的时候指定
     */
    public <E> E getProduct(ArrayList<E> list){
        return list.get(random.nextInt(list.size()));
    }

    /**
     * 泛型方法与泛型类中的类型不一致，没有相关。
     * @param list
     * @return
     * @param <T>
     */
    public <T> T getProduct1(ArrayList<T> list){
        return list.get(random.nextInt(list.size()));
    }

    /**
     * 静态的泛型方法，采用多个泛型类型
     * @param t
     * @param e
     * @param k
     * @param <T>
     * @param <E>
     * @param <K>
     */
    public static <T,E,K> void printType(T t,E e,K k) {
        System.out.println("t:" + t.getClass().getSimpleName());
        System.out.println("e:" + e.getClass().getSimpleName());
        System.out.println("k:" + k.getClass().getSimpleName());
    }

    /**
     * 泛型的可变参数的定义
     */
    public static <E> void print(E... e) {
        for (E e1 : e) {
            System.out.println(e1);
        }
    }
}
